from mcp.server.fastmcp import FastMCP
import requests
import json

# def parse_args():
#     """Parse command line arguments for MCP server."""
#     parser = argparse.ArgumentParser(description="Paper Search MCP Server")
#     parser.add_argument('--port', type=int, default=50001, help='Server port (default: 50001)')
#     parser.add_argument('--host', default='0.0.0.0', help='Server host (default: 0.0.0.0)')
#     parser.add_argument('--log-level', default='INFO', 
#                        choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
#                        help='Logging level (default: INFO)')
#     try:
#         args = parser.parse_args()
#     except SystemExit:
#         class Args:
#             port = 50001
#             host = '0.0.0.0'
#             log_level = 'INFO'
#         args = Args()
#     return args

# args = parse_args()
# mcp = FastMCP("paper_search", port=args.port, host=args.host)

# @mcp.tool()
def search_POI(city: str, keywords:str):
   """
# 搜索服务API接口说明
## 📌 接口概述
- 提供多种POI信息查询能力
- 支持筛选机制：关键字搜索、周边搜索、多边形搜索、ID查询

## 🏷️ 适用场景 - 关键字搜索
1. **POI关键词搜索**  
   （示例："肯德基"、"朝阳公园"）
2. **POI类型搜索**  
   （示例："银行"）
3. **复合关键字搜索**  
   （示例："旅店|美食|加油站"）

---

## 🔧 请求参数
| 参数名   | 描述                     | 说明                     |
|----------|--------------------------|--------------------------|
| city     | 查询城市                 | 可选，填城市中文名       |
| keywords | 搜索关键字               | 多个关键字用"\|"分隔连接 |

---

## 📤 返回结果参数
| 字段名      | 描述                     | 规则说明                                                                 |
|-------------|--------------------------|--------------------------------------------------------------------------|
| status      | 结果状态值               | `0`：请求失败<br>`1`：请求成功                                           |
| info        | 状态说明                 | status=0时返回错误原因，否则返回"OK"                                      |
| count       | 搜索方案数目             |                                                                          |
| suggestion  | 城市建议列表             | 当限定城市无结果时返回                                                   |
| keywords    | 查询关键字               |                                                                          |
| cities      | 城市匹配结果列表         | 包含匹配的多个城市信息                                                   |
| pois        | POI信息列表              | 包含匹配的所有POI信息                                                    |

### 🌆 cities 字段结构
| 字段名   | 描述                 |
|----------|----------------------|
| name     | 城市名称             |
| num      | 包含关键字的POI数量  |
| citycode | 城市编码             |
| adcode   | 行政区域编码         |

---

### 🏢 POI信息字段详解

| 字段名           | 描述                          | 返回条件及说明                                     |
|------------------|-------------------------------|------------------------------------------------|
| id               | 唯一ID                        |                                                |
| parent           | 父POI的ID                    | 当前POI有父POI时返回，可能为空                  |
| name             | 名称                          |                                                |
| type             | 兴趣点类型                    | 格式：大类;中类;小类<br>(例：餐饮服务;中餐厅...) |
| typecode         | 兴趣点类型编码                | (例：050118)                                   |
| biz_type         | 行业类型                      |                                                |
| address          | 地址                          | (例："东四环中路189号百盛北门")                 |
| location         | 经纬度                        | 格式：X,Y                                      |
| distance         | 离中心点距离(米)              | 仅在周边搜索时返回                             |
| tel              | 电话号码                      |                                                |
| postcode         | 邮编                          | extensions=all时返回                          |
| website          | 网址                          | extensions=all时返回                          |
| email            | 电子邮箱                      | extensions=all时返回                          |
| pcode            | 所在省份编码                  | extensions=all时返回                          |
| pname            | 所在省份名称                  | 直辖市会显示市名<br>(例："北京市")             |
| citycode         | 城市编码                      | extensions=all时返回                          |
| cityname         | 城市名                        | 直辖市会显示市名<br>(例："北京市")             |
| adcode           | 区域编码                      | extensions=all时返回                          |
| adname           | 区域名称                      | 区县级名称<br>(例："朝阳区")                   |
| entr_location    | 入口经纬度                    | 可作为POI到达点                               |
| exit_location    | 出口经纬度                    | 目前不返回内容                                |
| navi_poiid       | POI导航ID                     | extensions=all时返回                          |
| gridcode         | 地理格ID                      | extensions=all时返回                          |
| alias            | 别名                          | extensions=all时返回                          |
| parking_type     | 停车场类型                    | 地下/地面/路边<br>(仅停车场类POI返回)          |
| tag              | POI特色内容                   | 主要出现在美食类POI<br>(例："烤鱼,麻辣香锅")   |
| indoor_map       | 室内地图标志                  | `1`：有室内数据<br>`0`：无室内数据              |
| indoor_data      | 室内地图相关数据              | indoor_map=0时为空                             |
| cpid             | 父级POI ID                    | 建筑物类POI返回自身ID<br>商铺类POI返回所在建筑ID |
| floor            | 楼层索引                      | (例："8")                                      |
| truefloor        | 所在楼层                      | (例："F8")                                    |
| business_area    | 所属商圈                      | extensions=all时返回                          |
| biz_ext          | 深度信息                      | extensions=all时返回                          |
| photos           | 照片信息                      | extensions=all时返回                          |
| title            | 照片介绍                      | photos的子字段                                |
| url              | 照片链接                      | photos的子字段                                |

---

## 🧾 biz_ext 深度信息字段
> 仅存在于特定类型POI

| 字段名          | 描述             | 适用POI类型                 |
|-----------------|------------------|----------------------------|
| rating          | 评分             | 餐饮/酒店/景点/影院         |
| cost            | 人均消费         | 餐饮/酒店/景点/影院         |
| meal_ordering   | 是否可订餐       | 餐饮类POI（逐渐废弃）       |
| seat_ordering   | 是否可选座       | 影院类POI（逐渐废弃）       |
| ticket_ordering | 是否可订票       | 景点类POI（逐渐废弃）       |
| hotel_ordering  | 是否可以订房     | 酒店类POI（逐渐废弃）       |
   """
   base_url = "https://restapi.amap.com/v3/place/text?"
   key = "4567a7c1ab1b4f0152d966c1e001efc7"
   base_url += f"key={key}&keywords={keywords}&types=&city={city}&children=&offset=&page=&extensions=all"
   response = requests.get(base_url)
   print("响应码：", response.status_code)
   # print("响应文本：", response.text)
   # ans = json.loads(response.text)
   # print(ans)
   # for item in ans['pois']:
   #    print(item['biz_ext'])
   return response.text

import os

def saveMarkdownToFile(content: str, fileName: str) -> str:
    """
    将Markdown内容保存到指定路径，自动创建不存在的目录
    
    Args:
        content: 需要保存的Markdown文本内容
        fileName: 文件名(如从北京到上海旅游规划.md)具体可以自定义
    
    Returns:
        str: 成功返回'保存成功'，失败返回'保存失败'
    
    Raises:
        静默处理所有异常，通过返回'保存失败'表示失败
    """
    try:        
        with open('./output/'+fileName, 'w', encoding='utf-8') as md_file:
            md_file.write(content)
        
        # 返回文件名（路径的最后一部分）
        return '保存成功'
    
    except (OSError, IOError, TypeError, PermissionError, Exception) as e:
        # 包含常见错误：路径无效、权限不足、磁盘空间不足、文件被占用等
        return "保存失败"
    

def get_station_code(city_name: str) -> str:
    # 123官方数据源URL
    STATION_URL = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js"
    
    try:
        # 发送HTTPS请求获取车站数据
        response = requests.get(STATION_URL, timeout=5, headers={
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
        })
        response.raise_for_status()
        content = response.text.split('|||')
        for item in content:
            if len(item) < 4: continue
            x = item.split('|')
            if x[1] == city_name:
                return x[2]
        
        return "未找到请重新搜索，例如get_station_code_of_citys('北京|宁波')"  # 未找到
    
    except Exception as e:
        # 生产环境应添加日志记录
        return ""
    
def get_station_code_of_citys(citys):
    """
    通过城市名查询对应的火车站代码(station_code)
    
    参数:
        city_name: 要查询的城市，比如"北京"。若要查询多个城市，请用|分割，比如"北京|上海"
        
    返回:
        如下是一个返回的示例，如调用 get_station_code_of_citys('宁波|北京')
        [{'宁波': {'station_code': 'NGH', 'station_name': '宁波'}}, {'北京': {'station_code': 'BJP', 'station_name': '北京'}}]
        
    功能说明:
        1. 从12306官网获取最新全国车站代码表
        2. 自动转换简体/繁体中文
        3. 支持常见城市别名(如"北京市"→"北京")
        4. 自动选择主要车站(若城市有多个车站)
        
    注意事项:
        1. 需要联网访问12306
        2. 查询耗时约0.5秒
    """
    x = citys.split('|')
    ans = list()
    for item in x:
      ans.append({
          item: {
              'station_code': get_station_code(item),
              'station_name': item,
          }
      })
    return str(ans)

#       宁波:
# {
# station_code:
# "NGH"
# station_name:
# "宁波"
# }
# 北京:
# {
# station_code:
# "BJP"
# station_name:
# "北京"
# }
        
if __name__ == "__main__":
   # mcp.run(transport="sse")
   # ans = search_POI('宁波', '酒店|旅店|房')
   # print(ans)
   print(get_station_code_of_citys('宁波|北京'))